package cn.bluedot.tea.service;

import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.mail.MessagingException;
import javax.mail.Session;

import cn.bluedot.framework.annotations.Dispatcher;
import cn.bluedot.framework.annotations.RequestView;
import cn.bluedot.framework.annotations.ResponseJson;
import cn.bluedot.framework.annotations.Service;
import cn.bluedot.framework.service.BaseService;
import cn.bluedot.framework.web.Result;
import cn.bluedot.tea.dao.BaseDao;
import cn.bluedot.tea.pojo.domain.User;
import cn.bluedot.tea.util.Mail;
import cn.bluedot.tea.util.MailUtils;

@Service //注释这是一个service，必须
public class UserService extends BaseService{ //继承超类BaseService，必须

	public UserService(){} //无参构造函数
	
	/**
	 * 有参构造函数 ，必须
	 * @param uri 
	 * @param params
	 * @param data
	 */
	public UserService(String uri, Map<String, Object[]> params, Map<String, Object> data) {
		super(params, data); //调用父类有参构造，必须
		execute(uri, params, data); //执行业务，调用父类方法
	}
	
	@RequestView(uri="/getCode") //第一个参数为前端请求URI,第二个参数对应sql.xml里的view中的name属性
	@ResponseJson
	private void getCode(Map<String, Object[]> params, Map<String, Object> data) throws Exception{
		Map<String, Object> param = getParameterMap(params); //将数组值转为单个值
		String email = (String) param.get("email");
		
		//用户邮箱校验，此处省略
		//验证邮箱是否存在
		Map<String, Object> temp = new HashMap<String, Object>();
		temp.put("view", "selectUserCountByEmail");
		temp.put("email", email);
		
		int query = (int) BaseDao.excuteQuery(temp, null);
		if(query == 0) {
			data.put("message", email+"，用户不存在");
			data.put("Result", Result.FAILED);
			return;
		}

		Mail mail = new Mail();
		mail.setFrom("878006658@qq.com");
		mail.addTo(email);
		mail.setSubject("验证提醒");
		String code = String.valueOf(new Random().nextInt(899999) + 100000);  //得到6位验证码
		String content = "请将验证码填写到页面。如非本人操作，请忽略！<br/><br/>验证码："+code;
		mail.setContent(content);

		Session session = MailUtils.getSession("smtp.qq.com", "878006658@qq.com", "xgybupegcmrdbecj");

		try {
			MailUtils.send(session, mail);
			data.put("Result", Result.SUCCESS);
			data.put("code", code);
		} catch (MessagingException | IOException e ) {
			data.put("Result", Result.FAILED);
			data.put("message", "发送验证码失败");
			e.printStackTrace();
		}
		
		System.out.println(email+":"+code);
		
	}

	/**
	 * 用户登录
	 * @param params 前端传入的参数值
	 * @param data  处理后返回的数据
	 * @throws Exception 
	 */
	@RequestView(uri="/login",view="login") //第一个参数为前端请求URI,第二个参数对应sql.xml里的view中的name属性
	@Dispatcher(success="/index",failed="/login") //方法执行后，可能出现成功失败两种情况，可以使用重定向到不同页面
	private void login(Map<String, Object[]> params, Map<String, Object> data) throws Exception {
				
		Map<String, Object> param = getParameterMap(params); //将数组值转为单个值
		
		User user = (User) BaseDao.excuteQuery(param, User.class);
			
		if(user == null) {
			data.put("message", "邮箱或密码错误");
			data.put("Result",Result.FAILED); 
		} else {
			
			if(user.getStatus() == 0) {
				data.put("message", "当前用户被冻结，请先解冻");
				data.put("Result",Result.FAILED);
				return;
			}
			
			user.setPassword(null);
			data.put("user", user);
			data.put("Result",Result.SUCCESS); 
		}
	}
	
	/**
	 * 用户注册
	 * @param register 注册边界类
	 * @return  返回注册状态，成功返回true，失败返回false
	 * @throws Exception 
	 */
	@RequestView(uri="/register",view="register")
	@ResponseJson
	private void register(Map<String, Object[]> params, Map<String, Object> data) throws Exception {
		Map<String, Object> param = getParameterMap(params);
		//验证邮箱是否存在
		Object email = param.get("email");
		Map<String, Object> temp = new HashMap<String, Object>();
		temp.put("view", "selectUserCountByEmail");
		temp.put("email", email);
		
		int query = (int) BaseDao.excuteQuery(temp, null);
		if(query > 0) {
			data.put("message", email+"已被注册,您可通过找回密码找回账号");
			data.put("Result", Result.FAILED);
			return;
		}
		
		//查询当前年份注册用户数量
		temp.clear();
		temp.put("view", "selectUserCountById");
		temp.put("like", "2019%");
		
		int	size = (int) BaseDao.excuteQuery(temp, null);
		
		String number = String.format("%04d", (size+1));
		//查询当前年份有多少员工
		Calendar rightNow = Calendar.getInstance();
		int year = rightNow.get(Calendar.YEAR);
		System.out.println(year+number);
		param.put("userId", year+number);
		param.put("roleId", 4); //默认工作人员
		param.put("status", 1); //设置为启用
		param.put("head","assets/head/profile.jpg"); //设置为默认，后期可修改
		
		int excute = BaseDao.excute(param);
		
		if(excute > 0) {
			data.put("message", email+"注册成功,分配工号："+year+number);
			data.put("Result", Result.SUCCESS);
		} else {
			data.put("message", "注册失败");
			data.put("Result", Result.FAILED);
		}
		
	}

	/**
	 * 找回密码
	 * @param params 找回密码边界类
	 * @param data 找回密码状态，成功返回true，失败返回false
	 * @throws Exception 
	 */
	@RequestView(uri="/alter",view="alterPassword")
	@ResponseJson
	private void alterPassword(Map<String, Object[]> params, Map<String, Object> data) throws Exception {
		Map<String, Object> param = getParameterMap(params);
		//验证邮箱是否存在
		Object email = param.get("email");
		Map<String, Object> temp = new HashMap<String, Object>();
		temp.put("view", "selectUserCountByEmail");
		temp.put("email", email);
		
		int query = (int) BaseDao.excuteQuery(temp, null);
		if(query == 0) {
			data.put("message", email+"，用户不存在");
			data.put("Result", Result.FAILED);
			return;
		}
		
		int excute = BaseDao.excute(param);
		
		if(excute > 0) {
			data.put("message", "修改成功");
			data.put("Result", Result.SUCCESS);
		} else {
			data.put("message", "修改失败");
			data.put("Result", Result.FAILED);
		}
	}

	/**
	 * 修改密码
	 * @param params repassword 修改密码边界类
	 * @param data 修改密码状态，成功返回true，失败返回false
	 */
	@RequestView(uri="/retrive",view="retrivePassword")
	@ResponseJson
	private void retrivePassword(Map<String, Object[]> params, Map<String, Object> data) {
		
	}
	
	
	
	/**
	 * 更新个人信息
	 * @param params 用户PO实体类
	 * @param data 更新信息状态，成功返回true,失败返回false
	 */
	@RequestView(uri="/updateUser",view="updateUser")
	@ResponseJson
	private void updateUser(Map<String, Object[]> params, Map<String, Object> data){
		
	}
	
	/**
	 * 更新单个角色信息
	 * @param params 角色PO实体对象
	 * @param data 更新状态（成功，失败） 
	 */
	@RequestView(uri="/updateRole",view="updateRole")
	@ResponseJson
	private void updateRole(Map<String, Object[]> params, Map<String, Object> data){
		
	}
	
	/**
	 *  添加单个解冻申请
	 * @param params 解冻申请边界类对象
	 * @param data 处理结果（成功，失败）
	 */
	@RequestView(uri="/insertThawApplication",view="insertThawApplication")
	@ResponseJson
	private void insertThawApplication(Map<String, Object[]> params, Map<String, Object> data) {
		
	}

	/**
	 * 更新单个解冻申请
	 * @param params 冻结申请编号，改变的状态
	 * @param data 处理结果（成功，失败）
	 */
	@RequestView(uri="/updateThawApplication",view="updateThawApplication")
	@ResponseJson
	private void updateThawApplication(Map<String, Object[]> params, Map<String, Object> data){
		
	}
	
	
}
